<?php
	/*Fuente: http://ar.php.net/manual/es/function.header.php*/
	
	//Ultima verificacion: 15-10-2014 ; 22-11-2014 ; 21-02-2015
	class Archivo extends CI_Controller {
		
		//Metodo constructor de la clase
		function __construct(){
			parent::__construct();
			
			//Cargamos el helper form para poder utilizar todas las funciones de el, como subir archivos.
			$this->load->helper('form');
		}
		
		/*
		// Determine Content Type 
		switch ($ext) {
		  case "pdf": $ctype="application/pdf"; break; 
		  case "exe": $ctype="application/octet-stream"; break; 
		  case "zip": $ctype="application/zip"; break; 
		  case "doc": $ctype="application/msword"; break; 
		  case "xls": $ctype="application/vnd.ms-excel"; break; 
		  case "ppt": $ctype="application/vnd.ms-powerpoint"; break; 
		  case "gif": $ctype="image/gif"; break; 
		  case "png": $ctype="image/png"; break; 
		  case "jpeg": 
		  case "jpg": $ctype="image/jpg"; break; 
		  default: $ctype="application/force-download"; 
		}
		*/
		
		//Este es el metodo que se llama cuando queremos visualizar un archivo en el sistema
		//Este metodo no deberia usarse porque muestra los id de los archivos al publico. Se reemplazo por el siguiente que usa hash
		function _visualizar($idArchivo=null){
			//Primera Comprobacion: Que el usuario tenga iniciada la sesion
			if($this->session->userdata('sesionIniciada') == 'Si'){
				//Segunda Comprobacion: Que el id del archivo sea numerico y mayor que cero
				if(is_numeric($idArchivo) && $idArchivo>0){
					//Cargo el modelo donde estan los datos de los archivos registrados
					$this->load->model('m_archivo');
					
					//Busco al archivo que hay que visualizar
					$archivo = $this->m_archivo->get($idArchivo);
					
					//Tercera comprobacion: Que el archivo sea existente					
					if($archivo->num_rows() == 1){
						$filename = './'. $archivo->row()->ruta . '/' . $archivo->row()->nombre;
						header('Pragma: public');
						header('Expires: 0');
						header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
						header('Cache-Control: private', false); // required for certain browsers 
																		
						header("'Content-Type: " . $archivo->row()->contenttype . "'");
						
						header('Content-Disposition: attachment; filename="'. basename($filename) . '";');
																		
						header('Content-Transfer-Encoding: binary');
						header('Content-Length: ' . filesize($filename));
						
						readfile($filename);
						
						exit;
					} else {
						//El registro no existe
						//Destruimos la sesion ya que si llego hasta aca lo hizo mediante alguna tecnica no apropiada y no utilizando la interfaz del sistema.
						$this->session->sess_destroy();
						//Lo redirigimos al login ya que como no se llamo con ajax se puede redirigir.
						redirect(site_url("inicio"));
					}
				}else{
					//No se han pasado los parametros minimos necesarios para visualizar un archivo.
					//Destruimos la sesion ya que si llego hasta aca lo hizo mediante alguna tecnica no apropiada y no utilizando la interfaz del sistema.
					$this->session->sess_destroy();
					//Lo redirigimos al login
					redirect(site_url("inicio"));
				}
			}else{
				//El usuario no tiene permiso para realizar esta accion.
				//Destruimos la sesion ya que si llego hasta aca lo hizo mediante alguna tecnica no apropiada y no utilizando la interfaz del sistema.
				$this->session->sess_destroy();
				//Lo redirigimos al login
				redirect(site_url("inicio"));
			}
		}
		
		//Este es el metodo que se llama cuando queremos visualizar un archivo en el sistema
		//Este metodo utiliza codigo hash para que nadie intente adivinar o usar archivos que no tenga permiso de visualizar
		function hash($hash=null){
			//Primera Comprobacion: Que el usuario tenga iniciada la sesion
			if($this->session->userdata('sesionIniciada') == 'Si'){
				//Segunda Comprobacion: Que el hash del archivo sea mayor que 20
				if(strlen($hash)>=20){ //ctype_alnum($hash) && 
					//Cargo el modelo donde estan los datos de los archivos registrados
					$this->load->model('m_archivo');
					
					//Busco al archivo que hay que visualizar
					$archivo = $this->m_archivo->getPorHash($hash);
					
					//Tercera comprobacion: Que el archivo sea existente							
					if($archivo->num_rows() == 1){
						$filename = './'. $archivo->row()->ruta . '/' . $archivo->row()->nombre;
						header('Pragma: public');
						header('Expires: 0');
						header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
						header('Cache-Control: private', false); // required for certain browsers 
																		
						header("'Content-Type: " . $archivo->row()->contenttype . "'");
						
						header('Content-Disposition: attachment; filename="'. basename($filename) . '";');
						header('Content-Transfer-Encoding: binary');
						header('Content-Length: ' . filesize($filename));
												
						readfile($filename);

						exit;
					} else {
						//El registro no existe
						//Destruimos la sesion ya que si llego hasta aca lo hizo mediante alguna tecnica no apropiada y no utilizando la interfaz del sistema.
						$this->session->sess_destroy();
						//Lo redirigimos al login ya que como no se llamo con ajax se puede redirigir.
						redirect(site_url("inicio"));
					}
				}else{
					//No se han pasado los parametros minimos necesarios para visualizar un archivo.
					//Destruimos la sesion ya que si llego hasta aca lo hizo mediante alguna tecnica no apropiada y no utilizando la interfaz del sistema.
					$this->session->sess_destroy();
					//Lo redirigimos al login
					redirect(site_url("inicio"));
				}
			}else{
				//El usuario no tiene permiso para realizar esta accion.
				//Destruimos la sesion ya que si llego hasta aca lo hizo mediante alguna tecnica no apropiada y no utilizando la interfaz del sistema.
				$this->session->sess_destroy();
				//Lo redirigimos al login
				redirect(site_url("inicio"));
			}
		}
	}
	
	/* End of file archivo.php */
	/* Location: ./application/controllers/archivo.php */
?>